//
// Created by chen on 25-5-9.
//

#ifndef INA199A1DCKR_H
#define INA199A1DCKR_H

#include "stm32f1xx_hal.h"
#include <array>

// 相序枚举
enum Phase {
    PHASE_U = 0,
    PHASE_V = 1,
    PHASE_COUNT = 2  // 总相数
};
class INA199A1DCKR {
public:

    // 单例模式获取实例
    static INA199A1DCKR& instance();

    // 初始化函数（需在CubeMX生成的ADC初始化后调用）
    void init(float shuntResistance = 0.02, float inaGain = 50);

    // 配置相序与ADC通道映射
    void configurePhaseChannel(Phase phase, uint32_t adcChannel);

    // 回调函数，由ADC中断调用
    void adcCallback();

    // 获取指定相的电流值
    float getCurrentValue(Phase phase) const;

    // 获取所有相的电流值数组
    std::array<float, PHASE_COUNT> getAllCurrentValues() const;

    // 获取转换完成标志
    bool isConversionComplete() const;

    // 清除转换完成标志
    void clearConversionFlag();

private:
    INA199A1DCKR();
    ~INA199A1DCKR() = default;
    INA199A1DCKR(const INA199A1DCKR&) = delete;
    INA199A1DCKR& operator=(const INA199A1DCKR&) = delete;

    // ADC原始值转换为电流值
    float convertToCurrent(uint16_t adcValue) const;

    // 配置参数
    float m_shuntResistance;  // 分流电阻值(Ω)
    float m_inaGain;          // INA199增益

    // 相序配置
    std::array<uint32_t, PHASE_COUNT> m_adcChannels;  // 各相ADC通道

    // 采样数据
    std::array<uint16_t, PHASE_COUNT> m_adcValues;     // ADC原始值
    std::array<float, PHASE_COUNT> m_currentValues;    // 转换后的电流值(A)
    bool m_conversionComplete;                         // 转换完成标志

    // 当前采样相索引
    uint8_t m_currentPhaseIndex;

    // 声明静态实例
    static INA199A1DCKR s_ina199;
};

// 声明外部函数，用于在中断处理函数中调用
extern "C" void ADC1_2_IRQHandler();

#endif //INA199A1DCKR_H
